﻿using System;
using System.Collections.Generic;
using System.Text;
using Modele;

namespace Controleur
{

    /**
     * La classe ModeInterface permet de définir un squelette  des méthodes disponibles pour l'ensemble des modes ou  dans chaque mode spécifique
    * @author Thomas Boulay 4Info INSA Rennes
    * @date mars 2010
    */
    public abstract class Mode
    {
        /***************/
        /** attributs **/
        /***************/

        // le controleur qui possède le mode
        protected static Controleur controleur;

        //la couleur de l'encre
        protected System.Drawing.Color couleur;

        //la largeur du trait
        protected int epaisseur;

        /***************/
        /**  méthodes **/
        /***************/



        /***********************/
        /**** Constructeurs ****/
        /***********************/


        /**
         * Mode(System.Drawing.Color _couleur, int _epaisseur)
         * 
         * @brief Constructeur
         * @param System.Drawing.Color _couleur : la couleur des traits par défaut
         * @param int _epaisseur : l'épaisseur des traits par défaut
         * @return void
        */
        public Mode(System.Drawing.Color _couleur, int _epaisseur)
        {
            couleur = _couleur;
            epaisseur = _epaisseur;
        }

        /**
         * Mode()
         * 
         * @brief Constructeur par défaut
         * @return void
        */
        public Mode()
        {
            couleur = System.Drawing.Color.Black;
            epaisseur = 1; /////////////////    /!\ peut provoquer des problèmes de taille
        }

        /**
         * Mode(Mode _mode)
         * 
         * @brief Constructeur par recopie
         * @param Mode _mode : le mode dont on récupère les infos
         * @return void
        */
        public Mode(Mode _mode)
        {
            controleur = _mode.getControleur();
            couleur = _mode.getCouleur();
            epaisseur = _mode.getEpaisseur();
        }


        /**************************************/
        /**Actions spécifiques à chaque mode **/
        /**************************************/


        /**
         * ActionZoneDessin(Microsoft.Ink.Stroke _stroke)
         * 
         * @brief écriture sur la zone de dessin
         * @param Stroke _stroke : objet contenant de nombreuses informations (analogue à ensemble de points)
         * @return void
        */
        public abstract void ActionZoneDessin(Microsoft.Ink.Stroke _stroke);

        /**
         * ActionBouton()
         * 
         * @brief clic sur le bouton sur le côté du stylet
         * @return void
        */
        public abstract void ActionBouton();



        /**
        * ActionEffacer(Microsoft.Ink.Strokes _strokes)
        * 
        * @brief tracer un trait sur la zone de dessin avec la "gomme"
        * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de stroke)
        * @return void
        */
        public abstract void ActionEffacer(Microsoft.Ink.Strokes _strokes);

        /**
        * ActionDoubleClic(Microsoft.Ink.Strokes _strokes)
        * 
        * @brief Action de double clic
        * @param Strokes _strokes : objet contenant de nombreuses informations (analogue à ensemble de stroke)
        * @return void
        */
        public abstract void ActionDoubleClic(Microsoft.Ink.Strokes _strokes);


        /**
         * rafraichirVue()
         * 
         * @brief rafraichirVue
         * @brief demander au contôleur de rafraichir la vue
         * @return void
        */
        public void rafraichirVue()
        {
            controleur.rafraichirVue();
        }


        /**
         * ActionGlobal1(Microsoft.Ink.Strokes _strokes)
         * 
         * @brief Actions globales à tous les modes
         * @param Strokes _strokes : objet contenant de nombreuses informations (analoge à ensemble de stroke)
         * @return void
        */
        public void ActionGlobal1(Microsoft.Ink.Strokes _strokes)
        {

        }


        /***********************/
        /** getters & setters **/
        /***********************/


        /**
        * getCouleur()
        * 
        * @brief Getter de l'attribut couleur
        * @return System.Drawing.Color couleur
        */
        public System.Drawing.Color getCouleur()
        {
            return couleur;
        }

        /**
        * getEpaisseur()
        * 
        * @brief Getter de l'attribut epaisseur
        * @return int eppaisseur
        */
        public int getEpaisseur()
        {
            return epaisseur;
        }


        /**
        * getEpaisseur()
        * 
        * @brief Getter de l'attribut epaisseur
        * @return int eppaisseur
        */
        public Controleur getControleur()
        {
            return controleur;
        }


        /**
        * setControleur(Controleur _controleur)
        * 
        * @brief setter de l'attribut controleur
        * @param Controleur _controleur : nouveau controleur
        * @return void
        */
        public void setControleur(Controleur _controleur)
        {
            controleur = _controleur;
        }

        /**
        * setCouleur(System.Drawing.Color _couleur)
        * 
        * @brief setter de l'attribut couleur
        * @param Color _couleur : nouvelle couleur
        * @return void
        */
        public void setCouleur(System.Drawing.Color _couleur)
        {
            couleur = _couleur;
        }


        /**
        * setEpaisseur(int _epaisseur)
        * 
        * @brief setter de l'attribut epaisseur
        * @param int _epaisseur : nouvelle epaisseur
        * @return void
        */
        public void setEpaisseur(int _epaisseur)
        {
            if (_epaisseur < 1) _epaisseur = 1;

            /*****************************************
             * ATTENTION taille limite de l'épaisseur, peut poser problème plus tard
             */

            if (_epaisseur > 20) _epaisseur = 20;

            epaisseur = _epaisseur;
        }


        /**************************************************/
        /** Ajout d'objets dans la strructure de données **/
        /**************************************************/




        /**
        * addStroke(Microsoft.Ink.Stroke _stroke)
        * 
        * @brief ajoute un Stroke dans la SDD
        * @param Stroke _stroke : objet contenant de nombreuses informations (analogue à ensemble de points)
        * @return void
        */
        public void addStroke(Microsoft.Ink.Stroke _stroke)
        {
            controleur.addStroke(_stroke);
            controleur.rafraichirVue();
        }


        /**
        * addInk(Microsoft.Ink.Ink _ink, Microsoft.Ink.DrawingAttributes _attributes)
        * 
        * @brief ajoute un ink dans la SDD
        * @param Ink _ink : encre
        * @param DrawingAttributes _attributes : Attributs d'écriture de l'encre
        * @return void
        */
        public void addInk(Microsoft.Ink.Ink _ink, Microsoft.Ink.DrawingAttributes _attributes)
        {
            controleur.addInk(_ink, _attributes);
            controleur.rafraichirVue();
        }

        /**
        * addBalise(Balise _balise)
        * 
        * @brief ajoute une balise dans la SDD
        * @param Balise _balise : balise
        * @return void
        */
        public void addBalise(Balise _balise)
        {
            controleur.addBalise(_balise);
        }


        /*
 public int getId(){
     return id;
 }*/







    }

}
